var request=new XMLHttpRequest();


function recuperarPwd() {
	var email=document.getElementById("emailRecu").value;
	var reqRecuperacion=new XMLHttpRequest();
	reqRecuperacion.open("get", "RecuperarPwd.action");
	reqRecuperacion.onreadystatechange = function() {
		if (reqRecuperacion.readyState==4) {
			if (reqRecuperacion.status==200) {
				alert("En caso de que estés dado de alta en el sistema, te llegará un correo para que recuperes tu contraseña");
			} else {
				alert("Hay un problema");
			}
		}
	};
	var pars="email=" + email;
	reqRecuperacion.send(pars);
}

function cargarJugadores() {
	//cargarJugador();
	request.open("post", "JugadoresConectados.action");
	request.onreadystatechange=actualizar;
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	request.send();
	cargarFormularios();
}

function cargarFormularios() {
	var formIdentificacion=document.getElementById("formIdentificacion");
	var formDesconectar=document.getElementById("formDesconectar");
	if (jugadorLocal==null) {
		formIdentificacion.style.visibility="visible";
		formDesconectar.style.visibility="hidden";
	} else {
		formIdentificacion.style.visibility="hidden";
		formDesconectar.style.visibility="visible";
		document.getElementById("emailJugador").innerHTML=jugadorLocal.email;
	}
}

function addJugador(email) {
	var tabla=document.getElementById("salaDeEspera");
	var trow=document.createElement("tr");
	var tdIzda=document.createElement("td");
	tdIzda.textContent=email;
	trow.appendChild(tdIzda);
	var tdDcha=document.createElement("td");
	if (jugadorLocal!=null) {
		var boton=document.createElement("input");
		boton.setAttribute("type", "button");
		boton.setAttribute("value", "Retarlo");
		boton.setAttribute("onclick", "jugadorLocal.retar(\"" + email + "\")");
		tdDcha.appendChild(boton);
	}
	trow.appendChild(tdDcha);
	tabla.appendChild(trow);
}

function actualizar() {
	if (request.readyState==4) {
		var jugadoresConectados=document.getElementById("jugadoresConectados");
		jugadoresConectados.removeChild(jugadoresConectados.childNodes[0]);
		var tabla=document.createElement("table");
		tabla.setAttribute("id", "salaDeEspera");
		var tbody=document.createElement("tbody");
		tabla.appendChild(tbody);
		var cabecera=document.createElement("th");
		cabecera.textContent="Sala de espera";
		tbody.appendChild(cabecera);
	
		var respuesta=request.responseText;
		var result=JSON.parse(respuesta);
		for (var i=0; i<result.jugadoresConectados.length; i++) {
			var trow=document.createElement("tr");
			tbody.appendChild(trow);
			var tdIzda=document.createElement("td");
			tdIzda.textContent=result.jugadoresConectados[i].email;
			trow.appendChild(tdIzda);
			var tdDcha=document.createElement("td");
			if (jugadorLocal!=null && tablero==null) {
				var boton=document.createElement("input");
				boton.setAttribute("type", "button");
				boton.setAttribute("value", "Retarlo");
				boton.setAttribute("onclick", "jugadorLocal.retar(\"" + result.jugadoresConectados[i].email + "\")");
				tdDcha.appendChild(boton);
			}
			trow.appendChild(tdDcha);
		}			
		jugadoresConectados.appendChild(tabla);
	}
}

/*** Clase Jugador y algunas operaciones relacionadas ***/
var jugadorLocal;

function identificar() {
	var formIdentificacion=document.getElementById("formIdentificacion");
	var email=formIdentificacion.getElementsByTagName("input")["email"].value;
	var pwd=formIdentificacion.getElementsByTagName("input")["pwd"].value;
	var pars="email=" + email + "&pwd=" + pwd; 
	var req=new XMLHttpRequest();
	req.open("post", "Identificar.action");
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	req.onreadystatechange=function() {
		if (req.readyState==4) {
			var result=JSON.parse(req.responseText);
			if (result.resultado=="OK") {
				jugadorLocal=new Jugador(email);
				jugadorLocal.save();
				cargarJugadores();
			} else {
				alert(result.resultado);
			}
		}
	};
	req.send(pars);
}


function cargarJugador() {
	var cadena=sessionStorage.jugadorLocal;
	if (cadena!=null) {
		var objeto=eval("(" + cadena + ")");
		jugadorLocal=new Jugador(objeto.email);
	}
}

function mostrarRechazoDeReto() {
	alert("Te han rechazado el reto");
}

Jugador.prototype.socket=null;

function Jugador(email) {
	this.email=email;
	if (this.socket==null) {
		this.socket=new WebSocket("ws://localhost:8080/ajedrezConStruts2/notificador/notificador");
		this.socket.onmessage = function(evento) {
			var textoJSON=evento.data;
			var mensaje=JSON.parse(textoJSON);
			if (mensaje.tipo=="error") {
				alert(mensaje.texto);
			} else if (mensaje.tipo=="teReta") {
				jugadorLocal.recibirReto(mensaje.retador);
			} else if (mensaje.tipo=="partida") {
				jugadorLocal.mostrarPartida(mensaje);
			} else if (mensaje.tipo=="avisoDeLlegada") {
				var recienLlegado=mensaje.emailDelLlegado;
				addJugador(recienLlegado);
			} else if (mensaje.tipo=="rechazoDeReto") {
				mostrarRechazoDeReto();
			}
		};
	}
};

Jugador.prototype.actualizarPartida = function(partida) {
	var zonaPartida=document.getElementById("partida");
	if (zonaPartida.firstChild==null) {
		alert("La estructura no existe");
		var tabla=document.createElement("table");
		var trow=document.createElement("tr");
		var tdIzda=document.createElement("td");
		tdIzda.setAttribute("id", "zonaMovs");
		var tdDcha=document.createElement("td");
		tdDcha.setAttribute("id", "formJugador");
		
		var form=document.createElement("form");
		var labelDe=document.createElement("label");
		labelDe.innerHTML="De: ";
		form.appendChild(labelDe);
		tdDcha.appendChild(form);
		
		tabla.appendChild(trow);
		trow.appendChild(tdIzda);
		trow.appendChild(tdDcha);
		zonaPartida.appendChild(tabla);
	} else {
		alert("La estructura ya existe");
	}
};

Jugador.prototype.mostrarPartida = function(partida) {
	var jugadorBlancas=partida.jugadorBlancas;
	var etiquetaColor;
	if (jugadorBlancas==jugadorLocal.email) {
		this.color='b';
		etiquetaColor="Llevas blancas";
	} else {
		this.color='n';
		etiquetaColor="Llevas negras";
	}
	tablero=new Tablero(partida);
	tablero.show(etiquetaColor);
};

Jugador.prototype.recibirReto = function(retador) {
	var areaRetos = document.getElementById("zonaDeRetos");
	var etiqueta=document.createElement("label");
	etiqueta.textContent=retador + " te reta";
	areaRetos.appendChild(etiqueta);
	var botonAceptar=document.createElement("input");
	botonAceptar.setAttribute("type", "button");
	botonAceptar.setAttribute("value", "Aceptar");
	botonAceptar.setAttribute("onclick", "jugadorLocal.aceptarReto(\"" + retador + "\")");
	var botonRechazar=document.createElement("input");
	botonRechazar.setAttribute("type", "button");
	botonRechazar.setAttribute("value", "Rechazar");
	botonRechazar.setAttribute("onclick", "jugadorLocal.rechazarReto(\"" + retador + "\")");
	areaRetos.appendChild(botonAceptar);
	areaRetos.appendChild(botonRechazar);
};

Jugador.prototype.aceptarReto = function(retador) {
	var mensaje={ "tipo" : "contestarReto",
			"emailRetador" : retador,
			"emailRetado" : this.email,
			"respuesta" : true};
	var cadena=JSON.stringify(mensaje);
	this.enviarMensaje(cadena);
};

Jugador.prototype.rechazarReto = function(retador) {
	var mensaje={ "tipo" : "contestarReto",
			"emailRetador" : retador,
			"emailRetado" : this.email,
			"respuesta" : false};
	var cadena=JSON.stringify(mensaje);
	this.enviarMensaje(cadena);
};

Jugador.prototype.enviarMensaje = function(mensaje) {
	this.socket.send(mensaje);
};

Jugador.prototype.retar = function(emailRetado) {
	var reto = new Reto(jugadorLocal.email, emailRetado);
	var cadena = JSON.stringify(reto);
	this.enviarMensaje(cadena);
};

Jugador.prototype.save = function() {
	sessionStorage.jugadorLocal = JSON.stringify(jugadorLocal);
};

Jugador.prototype.remove = function() {
	this.socket.close();
	sessionStorage.removeItem("jugadorLocal");
	jugadorLocal=null;
};

Jugador.prototype.desconectar = function() {
	var req=new XMLHttpRequest();
	req.open("post", "Desconectar.action");
	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	req.onreadystatechange=function() {
		if (req.readyState==4) {
			var result=JSON.parse(req.responseText);
			if (result.resultado=="OK") {
				jugadorLocal.remove();
				cargarJugadores();
			};
		};
	};
	req.send();
};

/*** Clase Reto ***/
function Reto(emailRetador, emailRetado) {
	this.tipo="reto";
	this.emailRetador=emailRetador;
	this.emailRetado=emailRetado;
}

/**** Tablero y piezas ******/
var tablero;

var BLANCO = -1;
var NEGRO = +1;

Tablero.prototype.origen=null;
Tablero.prototype.destino=null;
Tablero.prototype.idPartida=null;
Tablero.prototype.jugadorBlancas=null;
Tablero.prototype.jugadorNegras=null;
Tablero.prototype.ganador=null;
Tablero.prototype.colorTurno=null;
Tablero.prototype.disposicion=null;
Tablero.prototype.casillas=null;

function Tablero(partida) {
	this.idPartida=partida.id;
	this.jugadorBlancas=partida.jugadorBlancas;
	this.jugadorNegras=partida.jugadorNegras;
	this.ganador=partida.ganador;
	this.colorTurno=partida.colorTurno;
	this.disposicion=partida.disposicion;
	
	var color=NEGRO;
	this.casillas=new Array();
	for (var row=0; row<8; row++) {
		this.casillas[row]=new Array();
		for (var col=0; col<8; col++) {
			this.casillas[row][col]=new Casilla(color);
			this.casillas[row][col].setId(row, col);
			color=-color;
		}
		color=-color;
	}
	for (var i=0; i<this.disposicion.length; i++) {
		var casilla=this.disposicion[i];
		var filaC=casilla.i;
		var colC=casilla.j;
		var tipoC=casilla.tipo;
		var colorC=casilla.color;
		var pieza=null;
		if (tipoC=="t") {
			if (colorC=='b')
				pieza=new Torre(BLANCO);
			else
				pieza=new Torre(NEGRO);
		} else if (tipoC=="c") {
			if (colorC=='b')
				pieza=new Caballo(BLANCO);
			else
				pieza=new Caballo(NEGRO);
		} else if (tipoC=="a") {
			if (colorC=='b')
				pieza=new Alfil(BLANCO);
			else
				pieza=new Alfil(NEGRO);
		} else if (tipoC=="d") {
			if (colorC=='b')
				pieza=new Dama(BLANCO);
			else
				pieza=new Dama(NEGRO);
		} else if (tipoC=="r") {
			if (colorC=='b')
				pieza=new Rey(BLANCO);
			else
				pieza=new Rey(NEGRO);
		} else if (tipoC=="p") {
			if (colorC=='b')
				pieza=new Peon(BLANCO);
			else
				pieza=new Peon(NEGRO);
		}
		if (pieza!=null)
			this.casillas[filaC][colC].pieza=pieza;
	}
}

Tablero.prototype.show = function(miColor) {
	var areaTablero=document.getElementById("partida");
	var tabla=document.getElementById("tablero");
	var formJugada=document.getElementById("formJugada");
	var etiquetaColor=document.getElementById("etiquetaColor");

	if (tabla!=null) {
		areaTablero.removeChild(etiquetaColor);
		areaTablero.removeChild(tabla);
		areaTablero.removeChild(formJugada);
	}
	
	etiquetaColor=document.createElement("label");
	etiquetaColor.id="etiquetaColor";
	etiquetaColor.innerHTML=miColor;
	etiquetaColor.setAttribute("value", miColor);
	
	formJugada=document.createElement("form");
	formJugada.id="formJugada";
	var desde=document.createElement("label");
	desde.innerHTML="Desde";
	var hasta=document.createElement("label");
	hasta.innerHTML="hasta";
	var cajaDesde=document.createElement("input");
	cajaDesde.setAttribute("type", "text");
	cajaDesde.setAttribute("id", "cajaDesde");
	cajaDesde.setAttribute("name", "cajaDesde");
	var cajaHasta=document.createElement("input");
	cajaHasta.setAttribute("type", "text");
	cajaHasta.setAttribute("id", "cajaHasta");
	cajaHasta.setAttribute("name", "cajaHasta");
	formJugada.appendChild(desde); 
	formJugada.appendChild(cajaDesde); 
	formJugada.appendChild(hasta); 
	formJugada.appendChild(cajaHasta);

	tabla=document.createElement("table");
	tabla.id="tablero";
	tabla.setAttribute("width", "500px");
	tabla.setAttribute("height", "500px");
	
	var tbody=document.createElement("tbody");
	tabla.appendChild(tbody);

	var fila0=document.createElement("tr");
	tbody.appendChild(fila0);
	var celda0=document.createElement("td");
	if (jugadorLocal.color=='n') {
		fila0.appendChild(celda0);
		for (var col=7; col>=0; col--) {
			celda0=document.createElement("td");
			celda0.innerHTML=this.casillas[0][col].id.charAt(0);
			fila0.appendChild(celda0);
		}
	} else {
		fila0.appendChild(celda0);
		for (var col=0; col<8; col++) {
			celda0=document.createElement("td");
			celda0.innerHTML=this.casillas[0][col].id.charAt(0);
			fila0.appendChild(celda0);
		}
	}
	
	if (jugadorLocal.color=='n') {
		for (var row=0; row<8; row++) {
			var fila=document.createElement("tr");
			celda0=document.createElement("td");
			celda0.innerHTML=""+(row+1);
			fila.appendChild(celda0);
			tbody.appendChild(fila);			
			for (var col=7; col>=0; col--) {
				var casilla=this.casillas[row][col];
				var celda=document.createElement("td");
				fila.appendChild(celda);
				var boton=document.createElement("button");
				boton.className="casilla_" + casilla.show();
				boton.id=casilla.id;
				if (casilla.pieza!=null) {
					boton.className=casilla.pieza.show() + casilla.show();
				}
				var textoOnclick="tablero.enviarMovimiento(this)";
				boton.setAttribute("onclick", textoOnclick);
				celda.appendChild(boton);
			}
		}
	} else {
		for (var row=7; row>=0; row--) {
			var fila=document.createElement("tr");
			celda0=document.createElement("td");
			celda0.innerHTML=""+(row+1);
			fila.appendChild(celda0);
			tbody.appendChild(fila);
			for (var col=0; col<8; col++) {
				var casilla=this.casillas[row][col];
				var celda=document.createElement("td");
				fila.appendChild(celda);
				var boton=document.createElement("button");
				boton.className="casilla_" + casilla.show();
				boton.id=casilla.id;
				if (casilla.pieza!=null) {
					boton.className=casilla.pieza.show() + casilla.show();
				}
				var textoOnclick="tablero.enviarMovimiento(this)";
				boton.setAttribute("onclick", textoOnclick);
				celda.appendChild(boton);
			}
		}
	}

	areaTablero.appendChild(etiquetaColor);
	areaTablero.appendChild(tabla);	
	areaTablero.appendChild(formJugada);
};

Tablero.prototype.enviarMovimiento = function(idCasilla) {
	var sCol=idCasilla.id.charAt(0);
	var col=0;
	if (sCol=='a') col=0;
	else if (sCol=='b') col=1;
	else if (sCol=='c') col=2;
	else if (sCol=='d') col=3;
	else if (sCol=='e') col=4;
	else if (sCol=='f') col=5;
	else if (sCol=='g') col=6;
	else if (sCol=='h') col=7;
	var row=idCasilla.id.charAt(1)-1;
	if (this.origen==null) {
		this.origen=this.casillas[row][col];
		var cajaDesde=document.getElementById("cajaDesde");
		cajaDesde.value=idCasilla.id;
	} else {
		this.destino=this.casillas[row][col];
		if (this.destino==this.origen) {
			this.origen=null;
			this.destino=null;
			return;
		}
		var cajaDesde=document.getElementById("cajaDesde");
		var cajaHasta=document.getElementById("cajaHasta");
		cajaHasta.value=idCasilla.id;		

		this.destino.pieza=this.origen.pieza;
		this.origen.pieza=null;
		this.origen=null;
		casilla=null;
		
		var pars="desde=" + cajaDesde.value + "&hasta=" + cajaHasta.value + "&color=" + jugadorLocal.color + "&idPartida=" + this.idPartida;
		var req=new XMLHttpRequest();
		req.open("post", "EnviarMovimiento.action");
		req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.onreadystatechange=function() {
			if (req.readyState==4) {
				var result=JSON.parse(req.responseText);
				if (result.resultado!="OK")
					alert(result.resultado);
			}
		};
		req.send(pars);
	}
};

Tablero.prototype.mover = function(desde, hasta) {
	var sCol=desde.charAt(0);
	var col=0;
	if (sCol=='a') col=0;
	else if (sCol=='b') col=1;
	else if (sCol=='c') col=2;
	else if (sCol=='d') col=3;
	else if (sCol=='e') col=4;
	else if (sCol=='f') col=5;
	else if (sCol=='g') col=6;
	else if (sCol=='h') col=7;
	var row=desde.charAt(1)-1;
	var pieza=this.casillas[row][col].pieza;
	if ((row+col)%2==0)
		this.casillas[row][col].pieza=null;
	else
		this.casillas[row][col].pieza=null;
	
	sCol=hasta.charAt(0);
	col=0;
	if (sCol=='a') col=0;
	else if (sCol=='b') col=1;
	else if (sCol=='c') col=2;
	else if (sCol=='d') col=3;
	else if (sCol=='e') col=4;
	else if (sCol=='f') col=5;
	else if (sCol=='g') col=6;
	else if (sCol=='h') col=7;
	row=hasta.charAt(1)-1;
	this.casillas[row][col].pieza=pieza;
};

// 12345321
// 66666666
// 00000000
// 77777777
// 89ABCA98
Tablero.prototype.codifica = function() {
	var result="";
	for (var row=0; row<8; row++) {
		for (var col=0; col<8; col++) {
			var casilla=this.casillas[row][col];
			if (casilla.pieza==null)
				result=result + "0";
			else
				result=result + casilla.pieza.codifica();
		}
	}
	return result;
};

Tablero.prototype.descodifica = function(cadena) {
	var row, col;
	for (row=0; row<8; row++) {
		for (col=0; col<8; col++) {
			var casilla=this.casillas[row][col];
			casilla.pieza=null;
		}
	}
	row=0; col=0;
	for (var i=0; i<cadena.length; i++) {
		if (cadena[i]=='1')
			this.casillas[row][col].pieza=new Torre(NEGRO);
		else if (cadena[i]=='8')
			this.casillas[row][col].pieza=new Torre(BLANCO);
		else if (cadena[i]=='2')
			this.casillas[row][col].pieza=new Caballo(NEGRO);
		else if (cadena[i]=='9')
			this.casillas[row][col].pieza=new Caballo(BLANCO);
		else if (cadena[i]=='3')
			this.casillas[row][col].pieza=new Alfil(NEGRO);
		else if (cadena[i]=='A')
			this.casillas[row][col].pieza=new Alfil(BLANCO);
		else if (cadena[i]=='4')
			this.casillas[row][col].pieza=new Dama(NEGRO);
		else if (cadena[i]=='B')
			this.casillas[row][col].pieza=new Dama(BLANCO);
		else if (cadena[i]=='5')
			this.casillas[row][col].pieza=new Rey(NEGRO);
		else if (cadena[i]=='C')
			this.casillas[row][col].pieza=new Rey(BLANCO);
		else if (cadena[i]=='6')
			this.casillas[row][col].pieza=new Peon(NEGRO);
		else if (cadena[i]=='7')
			this.casillas[row][col].pieza=new Peon(BLANCO);
		col++;
		if (col==8) {
			col=0;
			row++;
		}
	}
};

/*** Peon ***/
function Peon(color) {
	this.color=color;
}

Peon.prototype.show = function() {
	if (this.color==BLANCO) {
		return "peon_Blanco_En_";
	} else {
		return "peon_Negro_En_";
	}
};

Peon.prototype.codifica = function() {
	return this.color==BLANCO ? '7' : '6';
};

/*** Caballo ***/
function Caballo(color) {
	this.color=color;
}

Caballo.prototype.show = function() {
	if (this.color==BLANCO) {
		return "caballo_Blanco_En_";
	} else {
		return "caballo_Negro_En_";
	}
};

Caballo.prototype.codifica = function() {
	return this.color==BLANCO ? '9' : '2';
};

/*** Alfil ***/
function Alfil(color) {
	this.color=color;
}

Alfil.prototype.show = function() {
	if (this.color==BLANCO) {
		return "alfil_Blanco_En_";
	} else {
		return "alfil_Negro_En_";
	}
};

Alfil.prototype.codifica = function() {
	return this.color==BLANCO ? 'A' : '3';
};

/*** Torre ***/
function Torre(color) {
	this.color=color;
}

Torre.prototype.show = function() {
	if (this.color==BLANCO) {
		return "torre_Blanca_En_";
	} else {
		return "torre_Negra_En_";
	}
};

Torre.prototype.codifica = function() {
	return this.color==BLANCO ? '8' : '1';
};

/*** Dama ***/
function Dama(color) {
	this.color=color;
}

Dama.prototype.show = function() {
	if (this.color==BLANCO) {
		return "dama_Blanca_En_";
	} else {
		return "dama_Negra_En_";
	}
};

Dama.prototype.codifica = function() {
	return this.color==BLANCO ? 'B' : '4';
};

/*** Rey ***/
function Rey(color) {
	this.color=color;
}

Rey.prototype.show = function() {
	if (this.color==BLANCO) {
		return "rey_Blanco_En_";
	} else {
		return "rey_Negro_En_";
	}
};

Rey.prototype.codifica = function() {
	return this.color==BLANCO ? 'C' : '5';
};

/*** Casilla ***/

function Casilla(color) {
	this.color=color;
	this.pieza=null;
}

Casilla.prototype.setId = function(row, col) {
	this.id=String.fromCharCode(97 + col) + (row+1);
};

Casilla.prototype.show = function() {
	var colorCasilla;
	if (this.color==BLANCO) {
		colorCasilla="Blanca";
	} else {
		colorCasilla="Negra";
	}
	return colorCasilla;
};

/******************/

function init(desde, hasta) {
	if(typeof(Storage)=="undefined") {
		document.getElementById("areaTablero").innerHTML="Lo sentimos, su versión del navegador no permite jugar a este juego"; 
	} else {
		var cadena=localStorage.tablero;
		tablero=new Tablero();
		if (cadena!=null) {
			tablero.descodifica(cadena);
			if (desde!="null" && hasta!="null") {
				tablero.mover(desde, hasta);
			}				
		}
		cadena=tablero.codifica();
		localStorage.tablero=cadena;
		tablero.show();
	}
}

function reiniciarTablero() {
	if(typeof(Storage)=="undefined") {
		document.getElementById("areaTablero").innerHTML="Lo sentimos, su versión del navegador no permite jugar a este juego"; 
	} else {
		localStorage.clear();
		init(null, null);
	}
}